package com.i2works.smartluolong.utils.common;

import com.i2works.smartluolong.utils.base.DateConstant;
import com.xiaoleilu.hutool.date.DateUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间格式常量
 *
 * @author Liu Yutao <koal@vip.qq.com>
 * @date 2017/12/24 23:28
 */

public class DateUtils extends DateUtil {

    /**
     * 获取当前时间（年月日时分秒）
     *
     * @param timeFormat 时间格式
     */
    public static String get() {
        return DateFormatUtils.format(new Date(), DateConstant.ALL);
    }

    /**
     * 获取当前时间（年月日）
     *
     * @param timeFormat 时间格式
     */
    public static String getSimple() {
        return DateFormatUtils.format(new Date(), DateConstant.YYYY_MM_DD);
    }


    /**
     * 获取当前时间
     *
     * @param timeFormat 时间格式
     */
    public static String get(String timeFormat) {
        if (StringUtils.isNotBlank(timeFormat)) {
            return DateFormatUtils.format(new Date(), timeFormat);
        } else {
            return DateFormatUtils.format(new Date(), DateConstant.ALL);
        }
    }

    /**
     * 获取参数时间
     *
     * @param time       时间
     * @param timeFormat 时间格式
     */
    public static String get(Date time, String timeFormat) {
        if (StringUtils.isNotBlank(timeFormat)) {
            return DateFormatUtils.format(time, timeFormat);
        } else {
            return DateFormatUtils.format(time, DateConstant.ALL);
        }
    }

    /**
     * 将字符串转换成日期
     *
     * @param strTime    时间字符串
     * @param timeFormat 时间格式
     */
    public static Date str2Date(String strTime, String timeFormat) {
        LocalDate localDate;
        if (StringUtils.isNotBlank(timeFormat)) {
            localDate = LocalDate.parse(strTime, DateTimeFormatter.ofPattern(timeFormat));
        } else {
            localDate = LocalDate.parse(strTime, DateTimeFormatter.ofPattern(DateConstant.ALL));
        }
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
        return Date.from(instant);
    }


    /**
     * 获得某天最大时间 2018-03-20 17:00:00
     */
    public static Date getEndOfDay(String date) {
        Calendar calendarEnd = Calendar.getInstance();
        calendarEnd.setTime(DateUtils.str2Date(date, DateConstant.YYYYMMDD));
        calendarEnd.set(Calendar.HOUR_OF_DAY, 17);
        calendarEnd.set(Calendar.MINUTE, 0);
        calendarEnd.set(Calendar.SECOND, 0);
        //防止mysql自动加一秒,毫秒设为0
        calendarEnd.set(Calendar.MILLISECOND, 0);
        return calendarEnd.getTime();
    }

    /**
     * 获得某天最小时间 2018-03-20 00:00:00
     */
    public static Date getStartOfDay(Date date) {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
        LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
        return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
    }
    
    
    /**
     * 获得N天前的时间
     */
    public static Date getBeforeTime(int days) {
    	Calendar calendar = Calendar.getInstance();
    	  calendar.add(Calendar.DATE, -days);
    	  Date date = calendar.getTime();
        return date;
    }
    
    /**
     * 获得N天后的时间
     */
    public static Date getLaterTime(int days) {
    	Calendar calendar = Calendar.getInstance();
    	  calendar.add(Calendar.DATE, days);
    	  Date date = calendar.getTime();
        return date;
    }
    
    /**
     * 根据身份证获得出生日期
     */
    public static Date getBirthdayByIDcard(String IDcard) {
    	Date birthday = DateUtils.str2Date(IDcard.substring(6, 14), "yyyyMMdd");
        return birthday;
    }
    
    /**
     * 根据身份证获得年龄
     */
    public static Integer getAgeByIDcard(String IDcard) {
    	 String birthday = IDcard.substring(6, 14);
    	 Date date = DateUtils.str2Date(birthday, "yyyyMMdd");
        return (int) DateUtil.betweenYear(date, new Date(), false);
    }

}
